#include "client.h"

const char *log_level_strings[] = {
    "DEBUG",
    "INFO",
    "WARNNING",
    "ERROR"
};

// 定义一个静态日志路径
char log_file_path[MAX_LOG_PATH] = "./app.log";

// 定义全局日志级别变量，默认为 LOG_DEBUG
LogLevel current_log_level = DEBUG;

void set_log_file(const char *path) {
    strncpy(log_file_path, path, MAX_LOG_PATH - 1);
    log_file_path[MAX_LOG_PATH - 1] = '\0';
}

void set_log_level(LogLevel level) {
    current_log_level = level;
}

void log_message(LogLevel level, const char *file, int line, const char *func, const char *format, ...) {
    // 如果当前日志级别高于要记录的日志级别，则不记录
    if (level < current_log_level) {
        return;
    }

    time_t now;
    struct tm *local_time;
    char time_str[20];
    char message[MAX_LOG_MESSAGE];
    va_list args;

    // 获取当前时间
    time(&now);
    local_time = localtime(&now);
    strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", local_time);

    // 格式化日志消息
    va_start(args, format);
    vsnprintf(message, MAX_LOG_MESSAGE, format, args);
    va_end(args);

    // 确保日志目录存在
    char *last_slash = strrchr(log_file_path, '/');
    if (last_slash) {
        *last_slash = '\0';
        mkdir(log_file_path, 0755);
        *last_slash = '/';
    }

    // 打开日志文件
    FILE *log_file = fopen(log_file_path, "a");
    if (log_file == NULL) {
        perror("无法打开日志文件");
        return;
    }

    // 写入日志，包含函数名
    fprintf(log_file, "%s %s[%d]: %s:%d:%s: %s\n", 
            time_str, log_level_strings[level], getpid(), file, line, func, message);

    fclose(log_file);
}

// // 使用示例
// void apply_config(ConfigItem *config, int count) {
//     for (int i = 0; i < count; i++) {
//         if (strcmp(config[i].key, "日志路径") == 0) {
//             set_log_file(config[i].value);
//         } else if (strcmp(config[i].key, "日志级别") == 0) {
//             if (strcmp(config[i].value, "DEBUG") == 0) {
//                 set_log_level(LOG_DEBUG);
//             } else if (strcmp(config[i].value, "INFO") == 0) {
//                 set_log_level(LOG_INFO);
//             } else if (strcmp(config[i].value, "WARN") == 0) {
//                 set_log_level(LOG_WARN);
//             } else if (strcmp(config[i].value, "ERROR") == 0) {
//                 set_log_level(LOG_ERROR);
//             }
//         }
//         // 可以添加更多配置项的处理
//     }
// }

// int read_config(const char *filename, ConfigItem **config, int *count) {
//     FILE *file = fopen(filename, "r");
//     if (file == NULL) {
//         LOG_ERROR("无法打开配置文件: %s", filename);
//         return -1;
//     }

//     *config = NULL;
//     *count = 0;
//     char line[MAX_KEY_LENGTH + MAX_VALUE_LENGTH + 2];  // 额外的空间用于 '=' 和 '\0'

//     while (fgets(line, sizeof(line), file)) {
//         // 跳过空行和注释行
//         if (line[0] == '\n' || line[0] == '#' || line[0] == '[') {
//             continue;
//         }

//         char *equals = strchr(line, '=');
//         if (equals) {
//             *equals = '\0';  // 将 '=' 替换为字符串结束符
//             char *key = line;
//             char *value = equals + 1;

//             // 去除键和值两端的空白字符
//             while (isspace(*key)) key++;
//             char *end = key + strlen(key) - 1;
//             while (end > key && isspace(*end)) *end-- = '\0';

//             while (isspace(*value)) value++;
//             end = value + strlen(value) - 1;
//             while (end > value && isspace(*end)) *end-- = '\0';

//             // 分配新的 ConfigItem
//             *config = realloc(*config, (*count + 1) * sizeof(ConfigItem));
//             if (*config == NULL) {
//                 LOG_ERROR("内存分配失败");
//                 fclose(file);
//                 return -1;
//             }

//             strncpy((*config)[*count].key, key, MAX_KEY_LENGTH - 1);
//             (*config)[*count].key[MAX_KEY_LENGTH - 1] = '\0';
//             strncpy((*config)[*count].value, value, MAX_VALUE_LENGTH - 1);
//             (*config)[*count].value[MAX_VALUE_LENGTH - 1] = '\0';

//             (*count)++;
//         }
//     }

//     fclose(file);
//     return 0;
// }